/*	--- 解释器 Interpreter --- 


#	给定一个【语言】，定义【它的文法】的【一种表示】，并定义【一个解释器】，这个【解释器】使用【该表示】来【解释】语言中的句子。

============================================================


【解释器模式】（Interpreter）是一种【针对特定问题】设计的【一种解决方案】。

例如，【匹配字符串】的时候，由于【匹配条件】非常灵活，使得通过【代码】来【实现】非常不灵活。

举个例子，针对【以下的匹配条件】：

	· 以【+开头的数字】表示的区号和电话号码，如+861012345678；
	· 以【英文】开头，后接【英文和数字】，并【以.分隔】的【域名】，如www.liaoxuefeng.com；
	· 【以/开头】的【文件路径】，如/path/to/file.txt；
	...


因此，需要一种【通用的表示方法】——【正则表达式】来进行匹配。

【正则表达式】就是【一个字符串】，但要把【正则表达式】解析为【语法树】，然后再匹配【指定的字符串】，就需要一个【解释器】。

实现一个【完整的正则表达式的解释器】非常复杂，但是【使用解释器模式】却很简单： */

String s = "+861012345678";
System.out.println(s.matches("^\\+\\d+$")); // 使用解释器模式


/*
类似的，当我们使用JDBC时，【执行的SQL语句】虽然是【字符串】，但最终需要【数据库服务器的SQL解释器】来把【SQL】“翻译”成【数据库服务器能执行的代码】，

这个【执行引擎】也非常复杂，但对于【使用者】来说，仅仅需要【写出SQL字符串】即可。


============================================================


#	练习

请实现一个简单的解释器，它可以以SLF4J的日志格式输出字符串： 

Input:
log("[{}] start {} at {}...", LocalTime.now().withNano(0), "engine", LocalDate.now());

Output:
// [11:02:18] start engine at 2020-02-21...  */




/*================================================================


#	----- 解释器 の 小结 -----

1. 【解释器模式】通过【抽象语法树】实现【对用户输入的解释执行】。

2. 【解释器模式的实现】通常非常复杂，且一般【只能解决一类特定问题】。




*/

































